D:\a\tools.proto\tools.proto\compiler\src\compiler\util\imports.rs
Line | Count | Source |
1 | | // Copyright (c) 2024, BlockProject 3D |
2 | | // |
3 | | // All rights reserved. |
4 | | // |
5 | | // Redistribution and use in source and binary forms, with or without modification, |
6 | | // are permitted provided that the following conditions are met: |
7 | | // |
8 | | // * Redistributions of source code must retain the above copyright notice, |
9 | | // this list of conditions and the following disclaimer. |
10 | | // * Redistributions in binary form must reproduce the above copyright notice, |
11 | | // this list of conditions and the following disclaimer in the documentation |
12 | | // and/or other materials provided with the distribution. |
13 | | // * Neither the name of BlockProject 3D nor the names of its contributors |
14 | | // may be used to endorse or promote products derived from this software |
15 | | // without specific prior written permission. |
16 | | // |
17 | | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
18 | | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
19 | | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
20 | | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
21 | | // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
22 | | // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
23 | | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
24 | | // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
25 | | // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
26 | | // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
27 | | // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | | |
29 | | use crate::compiler::Protocol; |
30 | | use bp3d_util::index_map::IndexMap; |
31 | | use std::fmt::{Debug, Formatter}; |
32 | | |
33 | | pub trait ImportSolver { |
34 | | fn get_full_type_path(&self, protocol: &Protocol, type_name: &str) -> Option<String>; |
35 | | } |
36 | | |
37 | | impl ImportSolver for () { |
38 | 0 | fn get_full_type_path(&self, _: &Protocol, _: &str) -> Option<String> { |
39 | 0 | None |
40 | 0 | } |
41 | | } |
42 | | |
43 | | pub struct ProtocolStore<'a, T> { |
44 | | map: IndexMap<Protocol>, |
45 | | solver: &'a T, |
46 | | } |
47 | | |
48 | | impl<'a, T: ImportSolver> ProtocolStore<'a, T> { |
49 | 22 | pub fn new(solver: &'a T) -> Self { |
50 | 22 | Self { |
51 | 22 | map: IndexMap::new(), |
52 | 22 | solver, |
53 | 22 | } |
54 | 22 | } |
55 | | |
56 | 2 | pub fn len(&self) -> usize { |
57 | 2 | self.map.len() |
58 | 2 | } |
59 | | |
60 | 0 | pub fn is_empty(&self) -> bool { |
61 | 0 | self.map.is_empty() |
62 | 0 | } |
63 | | |
64 | 35 | pub fn insert(&mut self, protocol: Protocol) { |
65 | 35 | self.map.insert(protocol) |
66 | 35 | } |
67 | | |
68 | 92 | pub fn get(&self, full_name: &str) -> Option<&Protocol> { |
69 | 92 | self.map.get(full_name) |
70 | 92 | } |
71 | | |
72 | 38 | pub fn get_full_type_path(&self, protocol: &Protocol, type_name: &str) -> Option<String> { |
73 | 38 | self.solver.get_full_type_path(protocol, type_name) |
74 | 38 | } |
75 | | |
76 | 6 | pub fn iter(&self) -> impl Iterator<Item = &Protocol> { |
77 | 6 | self.map.iter() |
78 | 6 | } |
79 | | } |
80 | | |
81 | | impl<T> Debug for ProtocolStore<'_, T> { |
82 | 0 | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { |
83 | 0 | f.write_str("ProtocolStore { solver: ")?; |
84 | 0 | f.write_str(std::any::type_name::<T>())?; |
85 | 0 | f.write_str(", map: ")?; |
86 | 0 | self.map.fmt(f)?; |
87 | 0 | f.write_str(" }") |
88 | 0 | } |
89 | | } |